package gui.GLListeners.GLReceptaculos;

import figuras.PuntoVector;
import figuras.malla.MallaPorSplineYRevolucion;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.swing.JOptionPane;

import properties.Config;

import componentes.flor.Receptaculo;

import constantes.Consts;
import dataType.Coordenadas3D;
import dataType.DataFlowers;

public class GLListenerReceptaculoCircules extends GLListenerReceptaculo {

	private DataFlowers correspondencia2D;

	private String currentFileName;

	public GLListenerReceptaculoCircules(DataFlowers df) {
		super();
		correspondencia2D = df;
	}

	/***************************************************************************
	 * The init method *
	 * ********************************************************** Call by the
	 * GLDrawable just after the Gl-Context is * initialized. * * This method is
	 * used to : * - activate some modes like texture, light ... * - affect
	 * value to properties * - import testures, load your data ... * *
	 **************************************************************************/
	public void init(GLAutoDrawable glDrawable) {
		super.init(glDrawable);

		// para las texturas
		gl.glEnable(GL.GL_TEXTURE_2D);

		// File file = new File(Consts.DEFAULT_RECEPTACULOS_FILE);
		File file = new File(Consts.getReceptaculoByName(
				correspondencia2D.getReceptaculoFile()));
		if (file.exists()) {
			this.cargaReceptaculo(file);
		}
		if (correspondencia2D != null) {
			correspondencia2D.setReceptaculoFile(file.getName());
			correspondencia2D.setPerfil(this.componente.getBsplines().get(0)
					.getPerfil());
			((Receptaculo) componente).setDataFlowers(correspondencia2D);
		}
	}

	public void revolucion() {
		// if(manejadorSplines.getBsplines().size()>0){
		try {
			// ArrayList<PuntoVector> puntosControl = manejadorSplines
			// .getBsplines().get(0).getPuntosControl();
			ArrayList<PuntoVector> perfil = this.manejadorSplines.getBsplines()
					.get(0).getPerfil();
			if (perfil.get(0).getY() > perfil.get(perfil.size() - 1).getY()) {
				Config config = Config.getInstance();
				double radianes = config.getDouble("receptaculo.radianes.revolucion");
				int pasos = config.getInteger("receptaculo.pasos.revolucion");
				malla = new MallaPorSplineYRevolucion(manejadorSplines
						.getBsplines().get(0),radianes,pasos,false);
				componente = new Receptaculo(malla, this.manejadorSplines
						.getBsplines(), gl);
				componente.setColor(color);
				// actualizar componentes de data flowers
				if (correspondencia2D != null) {
					correspondencia2D.setPerfil(this.componente.getBsplines()
							.get(0).getPerfil());
				}
				this.creaReceptaculoTemp();
			} else {
				JOptionPane.showMessageDialog(null,
						"Dibuje el receptaculo de arriba a abajo",
						"Vuelva a dibujar", JOptionPane.INFORMATION_MESSAGE);
				this.limpiaCurvas();
			}
		} catch (java.lang.IndexOutOfBoundsException e) {
			JOptionPane.showMessageDialog(null, "Introduzca una spline",
					"Spline no introducida", JOptionPane.WARNING_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error",
					"Error creando receptaculo", JOptionPane.ERROR_MESSAGE);
		}

		camara.frontal();
		ejeXY = true;
	}

	public void guardaReceptaculo(File file) {
		try {
			if (componente != null) {
				((Receptaculo) componente).guardar(file);
				correspondencia2D.setReceptaculoFile(file.getName());
				currentFileName = file.getName();
			}
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Archivo no encontrado",
					"Error", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error al guardar", "Error",
					JOptionPane.ERROR_MESSAGE);
		} catch (java.lang.IndexOutOfBoundsException e) {
			JOptionPane.showMessageDialog(null, "Introduzca una spline",
					"Spline no introducida", JOptionPane.WARNING_MESSAGE);
		} finally {
			ejeXY = true;
		}
	}

	public void cargaReceptaculo(File file) {
		try {
			componente = new Receptaculo(gl, file);
			// receptaculo.cargar(file);
			this.manejadorSplines.setBsplines(componente.getBsplines());
			malla = (MallaPorSplineYRevolucion) componente.getMalla();
			this.color = componente.getColor();
			camara.esquina();
			correspondencia2D.setPerfil(this.componente.getBsplines().get(0)
					.getPerfil());
			((Receptaculo) componente).setDataFlowers(correspondencia2D);
			currentFileName = file.getName();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Archivo no encontrado",
					"Error", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error al cargar", "Error",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	public void reset() {
		//File temp = new File(Consts.RECEPTACULOS_FOLDER + "/temp");
		//File temp=new File(Consts.RECEPTACULOS_GALERIA_FOLDER+"/temp");
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm");
		String name = format.format(new Date());
		File temp = new File(Consts.RECEPTACULOS_GALERIA_FOLDER + name);
		temp.mkdir();
		temp = new File(temp.getAbsolutePath()+"/"+name);
		this.guardaReceptaculo(temp);
		this.limpiaCurvas();
		this.cargaReceptaculo(temp);
		this.reset2();
	}

	public void actualizaCorrespondencia() {
		if (correspondencia2D != null && correspondencia2D.getNum() > 0) {
			for (int i = 0; i < correspondencia2D.getNum(); i++) {
				ArrayList<Coordenadas3D> coord3D = correspondencia2D
						.getElementos3D(i);
				correspondencia2D.distribuye(coord3D.size(), i);
			}
		}
	}

	public String getReceptaculoFileName() {
		return currentFileName;
	}

	public void creaReceptaculoTemp() {
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm");
		String name = format.format(new Date());
		//File temp = new File(Consts.FOLDER_TMP_RECEPTACLES + "temp");
		//File temp=new File(Consts.RECEPTACULOS_GALERIA_FOLDER+"/temp");
		File temp = new File(Consts.RECEPTACULOS_GALERIA_FOLDER + name);
		temp.mkdir();
		temp = new File(temp.getAbsolutePath()+"/"+name);
		if (componente != null){
			this.guardaReceptaculo(temp);
			currentFileName = name;
		}
	}
}
